﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    using System;
    using System.Reflection;

    public class MyClass
    {
        public void NoParameterMethod()
        {
            Console.WriteLine("NoParameterMethod called");
        }

        public void ParameterMethod(int a, string b)
        {
            Console.WriteLine($"ParameterMethod called with {a} and {b}");
        }

        public static void StaticMethod(string message)
        {
            Console.WriteLine(message);
        }
    }

    class Program
    {
        static void Main()
        {
            MyClass myObject = new MyClass();
            Type myType = typeof(MyClass);

            // 调用无参数方法
            MethodInfo noParamMethod = myType.GetMethod("NoParameterMethod");
            noParamMethod.Invoke(myObject, null); // 或者 noParamMethod.Invoke(myObject, new object[0]);

            // 调用有参数方法
            MethodInfo paramMethod = myType.GetMethod("ParameterMethod");
            object[] parameters = new object[] { 10, "Hello" };
            paramMethod.Invoke(myObject, parameters);

            // 调用静态方法
            MethodInfo staticMethod = myType.GetMethod("StaticMethod");
            object[] staticParams = new object[] { "Hello, World!" };
            staticMethod.Invoke(null, staticParams);

            //4.总结
            //如果方法没有参数，parameters 可以为 null 或空数组。
            //如果方法有参数，parameters 必须是一个与参数列表匹配的数组，不能为 null。
            //对于静态方法，obj 必须为 null。
        }
    }
}
